/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ejercicio2;

import java.util.ArrayList;

/**
 *
 * @author Marcos
 */
public class Ejercicio2 {
       static Plato ensalada=new Plato("ensalada",2);
       static Plato pure=new Plato("pure",3);
       static Plato arroz=new Plato("arroz",4);
       static Plato provolone=new Plato("provolone",6);
       static Plato asado=new Plato("asado",7);
       static Plato helado=new Plato("helado",16);
       static Plato milanesa=new Plato("milanesa",17);
       static Plato pizza=new Plato("pizza",22);
       static int maxMenu=pizza.calorias;
       static Plato [] menu={ensalada,pure,arroz,provolone,asado,helado,milanesa,pizza};
       static int caloriasMax=33;
       static int[] vecCalorias=new int[menu.length];
       static int[][]matriz=new int[menu.length][caloriasMax];

    public static void main(String[] args) {
    vecCalorias=llenoVecCalorias();
    menu(vecCalorias,menu,caloriasMax);
    }

    //Pre: Se recibe un vector con las calorias de los platos, los platos y la maxima cantidad de calorias.
    //Debe haber al menos un plato.
    //Pos: Se despliega los detalles de cada plato con el total de calorias a consumir, para el valor mas alto, menor que el maximo de calorias.
    public static void menu(int[] Cal,Plato[] unMenu,int maxCal){
        for(int i=1;i<unMenu.length;i++){
           matriz[i][0]=0;
              for(int j=1;j<maxCal;j++){
                if(i==1&&j>Cal[1])
                    matriz[i][j]=Integer.MAX_VALUE;
                else if(i==1)
                    matriz[i][j]=Cal[1];
                else if(j<Cal[i])
                   matriz[i][j]=minimo(matriz[i-1][j],Cal[i]);
                else{
                    int a=matriz[i-1][j];
                    int b=Cal[i];
                    int c=matriz[i-1][j-Cal[i]];
                    if(b==Integer.MAX_VALUE||c==Integer.MAX_VALUE)       //Fix para suma con MAX_VALUE
                        matriz[i][j]=a;
                    else
                        matriz[i][j]=minimo(a,b+c);
                }
              }
             }
        printMatriz();
        if(matriz[unMenu.length-1][maxCal-1]<Integer.MAX_VALUE)
            getValorMenu(Cal,unMenu);
    }

    private static int minimo(int i, int j) {
        if(i<j){
            return i;
        }else{
            return j;
        }
    }


    private static int[] llenoVecCalorias() {
        for(int i=0;i<menu.length;i++){
            vecCalorias[i]=menu[i].calorias;
        }
            return vecCalorias;
    }

    private static void getValorMenu(int[]calorias,Plato[]unMenu) {
        int i=unMenu.length-1;
        int j=caloriasMax-1;
        ArrayList retorno=new ArrayList();
        while(i>0&&j>0){
            if(matriz[i][j]==matriz[i-1][j])
                i=i-1;
            else{
                retorno.add(menu[i]);
                j=j-calorias[i];
                i=i-1;
            }
        }
        mostrarResultado(retorno);
    }

    private static void mostrarResultado(ArrayList retorno) {
        int total=0;
        //System.out.println("Total de calorias en la comida: " +matriz[menu.length-1][caloriasMax-1]);
        for(int i=0;i<retorno.size();i++){
            Plato unPlato=(Plato) retorno.get(i);
            System.out.println(unPlato.toString());
            total+=unPlato.calorias;
        }
        System.out.println("Total de calorias en la comida: " +total);
    }

    private static void printMatriz() {
       for (int i = 0; i < menu.length; ++i) {
        for (int j = 0; j < caloriasMax; ++j) {
            if(matriz[i][j]==Integer.MAX_VALUE){
                System.out.print("M ");
            }else{
           System.out.print(matriz[i][j]+ " ");
            }

  }
 System.out.println();
 }
    }


}





